// ProjectName: go-learn-demo
// PackageName: redisybxb
// Description:
// Author: hy.bai
// Date: 2025-08-27 星期三 18:36

package redisybxb

import (
	"fmt"
	"log/slog"
)

// 从列表左边插⼊数据
func RedisLPush() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 从列表左边插⼊数据,支持插入任意个数据
	intCmd := client.LPush(*ctx, "name-lp", "name-hk-1", "name-hk-2", "name-hk-3", "name-hk-4", "name-hk-5")
	fmt.Println(intCmd.Val())
}

func RedisRPop() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 从列表的右边删除第⼀个数据，并返回删除的数据
	strCmd := client.RPop(*ctx, "name-lp")
	fmt.Println(strCmd.Val())
}

func RedisRPush() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 从列表右边插⼊数据, ⽀持⼀次插⼊任意个数据
	intCmd := client.RPush(*ctx, "name-lp", "data1", "data2")
	fmt.Println(intCmd.Val())
}

// 从列表左边删除第⼀个数据，并返回删除的数据
func RedisLPop() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 从列表左边删除第⼀个数据，并返回删除的数据
	strCmd := client.LPop(*ctx, "name-lp")
	fmt.Println(strCmd.Val())
}

// 返回列表的⼤⼩
func RedisLLen() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 从列表左边删除第⼀个数据，并返回删除的数据
	intCmd := client.LLen(*ctx, "name-lp")
	fmt.Println(fmt.Sprintf("列表的长度是:%d", intCmd.Val()))
}

// 返回列表的⼀个范围内的数据，也可以返回全部数据
func RedisLRange() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 返回列表的⼀个范围内的数据，也可以返回全部数据。两边都是包含关系(闭区间)
	// sliceCmd := client.LRange(*ctx, "name-lp", 1, 2)
	// 返回所有的元素是:开始下标是0, 结果下标是-1。
	sliceCmd := client.LRange(*ctx, "name-lp", 0, -1)
	fmt.Println(sliceCmd.Val())
}

// 删除列表中的数据
// 从列表左边开始，删除"name-hk-3"，如果出现重复元素，仅删除1次，也就是删除第⼀个
func RedisLRem() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 从列表左边开始，删除"name-hk-3"，如果出现重复元素，仅删除1次，也就是删除第⼀个
	intCmd := client.LRem(*ctx, "name-lp", 1, "name-hk-3")
	fmt.Println("intCmd:", intCmd.Val())
}

// 根据索引坐标，查询列表中的数据
func RedisLIndex() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 返回指定索引上元素。从左边开始数，且索引值是从0开始。
	strCmd := client.LIndex(*ctx, "name-lp", 1)
	fmt.Println("结果:", strCmd.Val())
}

func RedisLInsert() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 在指定位置插⼊数据
	// 在列表中, name-hk-2元素的前⾯插⼊ 欢迎你，name-hk-2元素的后⾯插⼊2025
	bIntCmd := client.LInsert(*ctx, "name-lp", "BEFORE", "name-hk-2", "欢迎你")
	aIntCmd := client.LInsert(*ctx, "name-lp", "AFTER", "name-hk-2", "2025")
	fmt.Println("Before:", bIntCmd.Val(), "After:", aIntCmd.Val())
}

// 当前go文件的调用入口
func TestList() {
	RedisLInsert()
}
